#include<iostream>
#include<unistd.h>
#include<pthread.h>
#include"lock.hpp"
using namespace std;


pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

#define NUM  10
int ticket = 1000;


void* mythread(void* args)
{
    pthread_detach(pthread_self());

    uint64_t number = (uint64_t)args;

    while(true)
    {
        {
            pthread_mutex_lock(&lock);
            if(ticket > 0)
            {
                usleep(1000);
                cout <<"thread: " << number << " ticket: " << ticket << endl;
                ticket--;
                
            }
            else 
            {
                break;
            }
            pthread_mutex_unlock(&lock);

        }
            
    }

    return nullptr;
}

int main()
{
    
    for(int i = 0; i < NUM; i++)
    {
        pthread_t tid;
        pthread_create(&tid,nullptr,mythread,(void*)i);
    }

    sleep(5);
    cout <<"process quit ..." <<endl; 
    
    return 0;
}











// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// #define NUM  10
// int ticket = 1000;


// void* mythread(void* args)
// {
//     pthread_detach(pthread_self());

//     uint64_t number = (uint64_t)args;

//     while(true)
//     {
//         pthread_mutex_lock(&mutex);
//         if(ticket > 0)
//         {
//             usleep(1000);
//             cout <<"thread: " << number << " ticket: " << ticket << endl;
//             ticket--;
            
//         }
//         else 
//         {
//             break;
//         }
//         pthread_mutex_unlock(&mutex);
//         usleep(20);
            
//     }

//     return nullptr;
// }

// int main()
// {
//     pthread_mutex_t mutex;

//     for(int i = 0; i < NUM; i++)
//     {
//         pthread_t tid;
//         pthread_create(&tid,nullptr,mythread,(void*)i);
//     }

//     sleep(5);
//     cout <<"process quit ..." <<endl; 
    
//     return 0;
// }